{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1. 导入包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np  \n",
    "import pandas as pd\n",
    "import math\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.axes as axes\n",
    "import seaborn as sns\n",
    "import gc\n",
    "\n",
    "from pandas.core.frame import DataFrame\n",
    "from scipy.fftpack import fft,ifft\n",
    "from tqdm import tqdm\n",
    "from matplotlib.figure import Figure\n",
    "from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas\n",
    "from matplotlib.ticker import Locator\n",
    "from matplotlib.ticker import MaxNLocator"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2. 加载数据文件"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>time</th>\n",
       "      <th>us</th>\n",
       "      <th>acc</th>\n",
       "      <th>avg_1</th>\n",
       "      <th>std_1</th>\n",
       "      <th>max_1</th>\n",
       "      <th>min_1</th>\n",
       "      <th>med_1</th>\n",
       "      <th>iqr_1</th>\n",
       "      <th>mcr_1</th>\n",
       "      <th>...</th>\n",
       "      <th>krt_8</th>\n",
       "      <th>fskw_8</th>\n",
       "      <th>fkrt_8</th>\n",
       "      <th>fmax_8</th>\n",
       "      <th>fspp_8</th>\n",
       "      <th>fetp_8</th>\n",
       "      <th>fctd_8</th>\n",
       "      <th>pca0</th>\n",
       "      <th>pca1</th>\n",
       "      <th>pca2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>15:52:08.395</td>\n",
       "      <td>1012464</td>\n",
       "      <td>35.98</td>\n",
       "      <td>35.98</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>35.98</td>\n",
       "      <td>35.98</td>\n",
       "      <td>35.980</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>-532.339041</td>\n",
       "      <td>-214.743826</td>\n",
       "      <td>92.691824</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>15:52:08.433</td>\n",
       "      <td>1044468</td>\n",
       "      <td>33.42</td>\n",
       "      <td>34.70</td>\n",
       "      <td>1.280000</td>\n",
       "      <td>35.98</td>\n",
       "      <td>33.42</td>\n",
       "      <td>34.700</td>\n",
       "      <td>2.56</td>\n",
       "      <td>0.500000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>-692.895763</td>\n",
       "      <td>-276.070715</td>\n",
       "      <td>117.397385</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>15:52:08.433</td>\n",
       "      <td>1076472</td>\n",
       "      <td>38.21</td>\n",
       "      <td>35.87</td>\n",
       "      <td>1.957056</td>\n",
       "      <td>38.21</td>\n",
       "      <td>33.42</td>\n",
       "      <td>35.980</td>\n",
       "      <td>4.79</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>-538.888225</td>\n",
       "      <td>-216.572312</td>\n",
       "      <td>93.119021</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>15:52:08.471</td>\n",
       "      <td>1108476</td>\n",
       "      <td>37.03</td>\n",
       "      <td>36.16</td>\n",
       "      <td>1.767725</td>\n",
       "      <td>38.21</td>\n",
       "      <td>33.42</td>\n",
       "      <td>36.505</td>\n",
       "      <td>1.05</td>\n",
       "      <td>0.250000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.824385</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>-502.400996</td>\n",
       "      <td>-202.636911</td>\n",
       "      <td>87.510401</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>15:52:08.508</td>\n",
       "      <td>1140476</td>\n",
       "      <td>38.31</td>\n",
       "      <td>36.59</td>\n",
       "      <td>1.799856</td>\n",
       "      <td>38.31</td>\n",
       "      <td>33.42</td>\n",
       "      <td>37.030</td>\n",
       "      <td>2.23</td>\n",
       "      <td>0.200000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.903630</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>-445.502007</td>\n",
       "      <td>-180.754675</td>\n",
       "      <td>78.616354</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 78 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "           time       us    acc  avg_1     std_1  max_1  min_1   med_1  iqr_1  \\\n",
       "0  15:52:08.395  1012464  35.98  35.98  0.000000  35.98  35.98  35.980   0.00   \n",
       "1  15:52:08.433  1044468  33.42  34.70  1.280000  35.98  33.42  34.700   2.56   \n",
       "2  15:52:08.433  1076472  38.21  35.87  1.957056  38.21  33.42  35.980   4.79   \n",
       "3  15:52:08.471  1108476  37.03  36.16  1.767725  38.21  33.42  36.505   1.05   \n",
       "4  15:52:08.508  1140476  38.31  36.59  1.799856  38.31  33.42  37.030   2.23   \n",
       "\n",
       "      mcr_1  ...     krt_8  fskw_8  fkrt_8  fmax_8  fspp_8  fetp_8  fctd_8  \\\n",
       "0  0.000000  ...  0.000000     0.0     0.0     0.0     0.0     0.0     0.0   \n",
       "1  0.500000  ...  0.000000     0.0     0.0     0.0     0.0     0.0     0.0   \n",
       "2  0.666667  ...  0.000000     0.0     0.0     0.0     0.0     0.0     0.0   \n",
       "3  0.250000  ...  0.824385     0.0     0.0     0.0     0.0     0.0     0.0   \n",
       "4  0.200000  ...  0.903630     0.0     0.0     0.0     0.0     0.0     0.0   \n",
       "\n",
       "         pca0        pca1        pca2  \n",
       "0 -532.339041 -214.743826   92.691824  \n",
       "1 -692.895763 -276.070715  117.397385  \n",
       "2 -538.888225 -216.572312   93.119021  \n",
       "3 -502.400996 -202.636911   87.510401  \n",
       "4 -445.502007 -180.754675   78.616354  \n",
       "\n",
       "[5 rows x 78 columns]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dataset_name = \"Printer\"\n",
    "csv_filename = \"Printer.csv\"\n",
    "csv_featured_filename = \"printer_featured_pca.csv\"\n",
    "df = pd.read_csv(csv_featured_filename\n",
    "                 #, names=[\"time\", \"us\", \"acc\",\"ws\",\"label\"]\n",
    "                )\n",
    "df.head(5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3. 预处理数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "the acc dist mean:37.96mg and std:11.93mg\n"
     ]
    }
   ],
   "source": [
    "acc_list = np.array(df[\"acc\"])\n",
    "acc_time = np.array(df[\"time\"])\n",
    "acc_us = np.array(df[\"us\"])\n",
    "acc_avg = np.array(df[\"avg_1\"])\n",
    "acc_std_list = np.array(df[\"std_1\"])\n",
    "acc_pca0_list = np.array(df[\"pca0\"])\n",
    "acc_pca1_list = np.array(df[\"pca1\"])\n",
    "\n",
    "acc_ms = [int(ms) for ms in acc_us/1000]\n",
    "acc_mean = np.mean(acc_list)\n",
    "acc_std  = np.std(acc_list)\n",
    "acc_mean_str = \"{:.2f}\".format(acc_mean)\n",
    "acc_std_str = \"{:.2f}\".format(acc_std)\n",
    "print(\"the acc dist mean:%.2fmg and std:%.2fmg\" %(acc_mean,acc_std))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4. 加速度传感器矫正"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 7164/7164 [00:00<00:00, 39763.64it/s]\n"
     ]
    }
   ],
   "source": [
    "# 加速度传感器校准用\n",
    "CONST_STATIC_WINDOW = 64\n",
    "static_mean_list = []\n",
    "static_std_list  = []\n",
    "#遍历加速度，寻找传感器安静的时间段，记录它的avg和std\n",
    "for k in tqdm(range(CONST_STATIC_WINDOW,acc_list.size,1)):\n",
    "    acc_list_slice = acc_list[k-CONST_STATIC_WINDOW:k]\n",
    "    acc_mean = np.mean(acc_list_slice)\n",
    "    acc_std  = np.std(acc_list_slice)\n",
    "    if acc_std < 5:\n",
    "        static_std_list.append(acc_std)\n",
    "        static_mean_list.append(acc_mean)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 5. 绘制加速度传感器在静止时候的均值-标准差分布"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAqgAAAKcCAYAAAAkU0jnAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3debhsV10n/O8PojdAbiKQMNiItBPtEIXGAXxbTSsoiAO02ND6KigtSjug3S0N4qvYIqitOLeirYI40Y6IggponAARFYNAQJAIAQI3EZMbMBeB9f6x9yGVyrnnVNWpYVWdz+d56rm3qnbtvfaufc751m+ttataawEAgF7cYtMNAACASQIqAABdEVABAOiKgAoAQFcEVAAAuiKgAgDQFQEVAICuCKgAAHRFQAUAoCsCKjurqj6lqn6jqt5YVWeq6m1V9eKq+v5Nt22VqqpN3d5ZVa+uqm+vqttsun0crKo+ZDxv/358766tqr+uqq+rqnOmlr1in/d773bDDNv6hqp6SVVdPf6MvLGqfrmqPnafZc+2ncctc//Xoaq+paoeNMfyjxj39W5H3O75VfWEqrq0qq6qquur6hVV9T+q6twF1nfHqrpmbNtDpp57+gHvWauqex9lX2DVzjl8Edg+VfXAJL+V5NIkj03y1iR3TvKJSR6W5L9trHHr8atJ9oL4eUk+I8m3Jfn4JF+0qUYxk9skuS7JdyZ5Y5IPTPK5SX4kyT2S/OeJZR+c5MTU6++a5FlJfmOGbd0+yfOS/E2SdyT5sCSPS/LnVXWv1tprppafPK/2vHGG7fTmWzLsy2+uebt3TfKNSZ6Z5KlJrk/yaUmemOR+VXW/Nt/3j/9YkrN9EPnOJD+xz+PPSXImyV/MsR1YOwGVXfXYJG9I8jmttfdMPP7LVfXYDbVpKarqA5K0qf2a9rbW2ksm7r+gqj40yZdW1bmttUOra2xGa+3yJA+fevh5VXWHJA+vqq9trZ0Zl/3r6ddX1eeM//0/M2zr26ce+qOqekmSVyX50gwfaiZNn1fM5w1J7tZae+fEY39QVe9M8r+S/D9J/nSWFVXVFyX5nCRfm+QZ08+31l6f5PVTr/mMJBcmeVJr7b0L7QGsiS5+dtXtk1y9X4hrrb1v+rGqeujY/f/Osdvt96rqnlPLPH187iOq6rnj/99UVd9fVSemln10Vf3NuMzpqrq8qp48tczHVdWzq+odVXVDVb28qh4+tcwlY3fcl43beXOG6sdHLHBMrk3Skrz/D1NV3W9sw5VjG15XVU+rqgun2nFRVf3kuL9nqupUVf1ZVd13arn7VtULq+q6qnrXuMxnLdDWvfU9cdz/j6+qXxm7u/+xqp5aVedU1d2r6nfHY3zFfh8+xm7V76uqN1TVu6vqzVX1gzU13KGqvraq/riq3j6eB6+oqseOHwgml7u0qv62qj6pqv5k3M+/r6rHVdUqf6eeSvK+TLx/06qqknxFkr9P8gdH2E6SHPQB6Kwmjs99qupFVfXP43vzFePzD6yqvxqP2yuq6v77rOMLq+qy8Vz7+6p6zN65MMP271lVvz2+j2eq6i1V9TtVdZfx+ZahSv3wurG7+9KJ1997PG9vGF/7lCQfsP/W5tNae+dUON3z0vHfD5llPVV1uwzV0ydkvgr2IzP8DviZqfVdMR6zz6thOMk/1zAs6PPG5x8x3n9nVb20qj5xnzZ9VVW9djzmr6qqL6nhd+YVc7QPbtRac3PbuVuSn8rwi/iHk3xKkg84YNlvyfCH/6eTPDBDt+mLMnS/fczEck/PEA5flWGIwGcl+Y7xtd82sdzDJrZ9v3G5r07yQxPL3D1DN+7rknxZhi7cXxxf99iJ5S4ZH7syya8k+fyxjbc7YH9ahj9e54y3D0ryheP2fn5q2a/J0KX7+Uk+PcmXJ3l5kssnj1mS303y9iRflWG4wBeO+/7QiWX+3/FY/MZ4DD8vQ3fie5J81j5tvHSG9/GJ47KXJ/nWJPdN8j3jYz+S5NVJvn58/GfGx//DxOtvneSvM4Subxrfi29I8k9JXpikJpZ96ng8PifJv8/QFXsqyc9MtenSJFcnee34vt53PN4tyZdPLXvOjLfaZ99rfO62SR6a4Xx88iHH635jO54w58/LLTMMFfg3Gbq935bkQ/Z5z/4xyT9n+Dn4yyRfsc+69o7P5Um+Mslnj+dBy1CRvSzDz8gDkrw4Qxf1B0+8/v4ZQvgfJnlQkockeUmG6mM7ZD9uM277L5J8cYZz+j8m+fEkHz0uc+8k70ryO+P/753x5zzJxyR5Z5JXjm38ggzn/j+M7b/bxLZuMeN7e8s5zvOPn/H9+vnx2N0iN/6OeMghr7lg3O/n7/PcFUnelOQVE+/NS5K8O8PP+Z9m+Jl+UJLXJLkqya0mXv+osQ2/muH305eMy12R5Ip5zkU3t73bxhvg5raKW4YK6p+MvzTb+Iv2zzKEsfMmlvuQJP+S5IenXn9ehnGrz5p47Onjur54atnfSXL5xP0fSfKOQ9r3S+Mf5ukQ8NzxD+QF4/29Pz5/NMe+t7PcnpvkNge8bi8Q3XVc/gsmnjud5AcOeO2tk1yT5LemHr9FhsD751OPvyfJC2fYl70/3P916vG/Hh9/8MRj52QI0b828djjMoSdT5x6/ReNr3/AWba7Fz6+bGzrbSeeu3R87SdPveaVSX53xvdi+vaIfdrwuInn35ehW/aw4/XLY3v/1Zw/LzdMbOs1GcPc1DK/kCF4fNp4/J47Lv+dU8vtHZ97TTx2u7Fd78pNw+gnjMt+/cRjL8049nbq5/HqHB5Q7zWu7wsPWe76JE8/y/F7V5I7Tjx2ywwfhKYD6tNnfG8vPaQtHz9u89dnfK8emOH32ceN9y/JbAH1a8blHrbPc1eMbfhXE4/tvTdvSXLrice/cHz88yd+Vt6a5CVT67zr2M4r5jkX3dz2bsagspNaa9ck+bSxK+qzMkyOuiTJU5J8dVV9Umvt6gzVsnOS/FzddIb0DUn+KEMl7SarzlANmnRZks+cuP/SJF9XVb+U4Q/en43bmvSZGQLam6Yef3qG6sV9MlRu9vzagTt8c/83w5i2JLlVhsk1/1+S362q+7ZxDGMN4xr/Z4Y/eh+cmw77+egME8329ukRVXVNkhck+cvW2r9MLPupGULIM6aOY8b9eGxV3aaN3ZuttXl/9/z21P1XZ/gD+ry9B1pr76mq1yX50InlPi/J3yZ5+VS7fi/De3nJ3jpqGNLxHRnGAd5uansfleTPJ+5f1Vp76dQyl2U4zpM+6cC9utEb9nns6RmO9e0ynC/fXFUXtNa+fr8VjN2+D8oQkt8843b3fGqGyVgfnqHS/IdV9VmttVfuLdBa+9Kp1/xaVT0nyeOq6odba6cmnntra+0vJ177j1X19gxh5S0Ty716/PdDx324TYaf1R9trb174vXXj9t6xCH78boMk72+p6runOSPW2uvOmznJ/z7DD+Xb5vY9nur6llJvn1q2Scm+dEZ1nn6bE/UcFWA385QvfzPZ1tuYvkLkjwtyfe01v52hm1PemSGD5Fnmzz38qnzZu+9ubS19q59Ht/7Obt7kjvlxt83SZLW2hur6s+S/Os52wlJTJJix7XWXpbkZcn7Jxd9T4Y/wI8db3ccFz3bjNbp8arvajefYHQmyfsvEdNae+YYhr4qQ7C8RVX9RZJvba09f1zs9hmqDtPeMvH8pP2WPcipcd/3/ElVncpQuX1EkqeN4yV/P0Mw/c4M3XvvzBBSX5Ih2O55aIYu9v88Lnt9Vf1GhuEIV+XG4/irB7TpduP6F/GPU/ffnf3fi3cnOX/i/h0zjNf9l+zvwiSpqrtmqLi/JsljMlSUbkjyyRm672819bpr9lnXmX2We/lZtjvtZuNKx+N61Xj396vqHUm+u6p+pu0zOSrDEIsTmWFy1D7b+qvxvy+pqt/KEPSenKFadpCfz/Ah4BMz8WEhN3+/kuG9ucnjrbV3D8Nm3//zc9sMlfy35eb2e+wmWmvX1jAR6Alj+29bVW/NMOTnSVMfqvZz+9x4zCft99gbMwy9ObRZ+z1Yw6TFP8yNQ2D2O2bTvivDufyjVfVB42Pnjf/eenzs2tbaTbZZVR+f4T36ob0Pp/s423uz389ecuN7tve76mzvmYDKQgRUjo3W2r9U1XdkCKgfNz68V9l8SIZxZsva1s8m+dmxIvTpGSpzv11VH9Va+4cMAefO+7z0g6fa9f5VLqFZl43/fsL478eN/39Ea+39s4Cr6mYTsMYK8Dcm+cYxzH1Bku9OcocMYwb32vv1GcLtfg4NGCtwdYYxk195wPPJUHm8TYbxq+8/D6pquiI6r8MC0Z6vyFAxPchexfajMgxxmPbIDMd4uto8l9ba6aq6fNzOYWr892YTDxf0jgzn+h33ee5Os6ygtfaKJA8bJ4x9fIYPZN+W4Tz47kNefs1ZtrPfYz+Tm19tYT9/lKFS/35jOL00w/G7pLU2S9BNhp/Zu2X/wLz3M3zbDGOsJz1y/HfuDy8z2PuwtvB7BvsRUNlJVXXn1tp+VcePHv/dq1T+XoYKxoe31ubtRj/U2KX9vKr6wAyTTz42QxB+YZIHV9UHT3V5fnmGsWCruJTPXth6+17zxn+nKypffdBKWmtvzFDB+awM3eHJML73nzJMNpml23NdfjvDJLhrWmv7daPvudmxGAPOVx1x+0fp4p+2N9zkddNPjENZPj7J97aDLz92qBqu4HBxhvf0MF+WIYT/5WELzqK19s6qelmSB1XVf9/r5q+q8zJUaudZV8twfddvqqpHJPm3E0/vV+1OhormF1TVHfe6+avqlhl6EKY9MQt08Y8f8C7NMLb1kskPRDP4xgyTHifdI8kPjO35owzjaye3dyJDdf2lCwwLmMXepKn/mGGi4d5275ph6MhbzvI6OJCAyq76vaq6MsN40cszdFvfI8Ps++uT/FCStNauqKpvS/JdVfVhGcZLviNDNeCTk7yz3fxakQeqqp/KUK35swxd83dK8vgMl3naG0rwHRn+4P5hVf3PDN1oX5phLOhjW2vXLrjfe+5YN35TzLkZ9v1bM4TInx0fvzzDdRK/ewxj/5hhNv/9pvbnggx/uH9xfM3pDMHr/kl+PXn/GMGvzzAG9XYZuvrfnuSiDFXai1prj55Y53syTPxa+BJUM/rBDBN6/riqfiBDFfkWGSZwfHaS72+t/XmS52fouvylqvreDMfs0RmqUQubGmYxk7HKf8ckf5zkzRkCyf0zhOVfmRzbOWGvQvbTB6z3dWObPmK8f0GG/f7FJH+X4Zz9qAxDHE5kOEf3XvvNGWa4vzBDt/Ydxm1+dpIn7jPG+ii+LcPEw9+rqh/KEOS+OcPP7fTY4JsYL4v0XzJ8GPz7DBXK/5DhGD5/YtFXJLmkqj4/w8/o6TZ8KcGTMvQO/MH4c/muDNcZvdk3sLXWrsgwFGRm45jvP8zQe/LIJHcYH9tz5V41dayyvj7JM1prjxy3ebMhI2M3fJK8srV26T6bfVCG47aK6mlaa++rqm/PMGzoVzNUlj8ow5jdt2Z51XWOGQGVXfWkDOPnvinDH4MTGX5ZviDJU1prewP901p7SlW9KsMf5v80LntVhjC53zexHOZPMnQr/scMAefqDJdp+fK9iSSttddU1admGCe3N8bx1Rku2/P0BbY57SHjLRkqXG/KMOHpu/YqNuOQh8/PENaflqGS/IIMl02avLbiDRkmCH1Zhu7FDxif/54k37u3UGvt56vqjRnG9j4tyckMIfXluXn39S3H20qNFblPyzAj/lEZxsP989j+F2QMGK21y2u48PmTMoTuazIEt6fmpmMr1+FlGS6F9aAM4/tuyHBps2/KcLmkm6iqW2U4b/+4tfbaA9Y7/fv+hgwVxkdluJrFuRnO+0uTfNHU5KLLMwS3B2Y4p/85w/v6n1prvzzf7h2stfa743vxPzN8I9ZVSf53huEvX3bIy/8uw4ewx47LvztDhe8mw1gy/Kz/WIZJjLfO2A3fWvvbGq7t+/0ZuszfkeFbn34tyU8uYfc+JsO3dSXD+N1p35GhEpoM4XoZPyePzDD2e6nv06TW2k/WcH3Zx2aYhHVFhuEUX5jhwyDMrabGUgNAV8YJji9P8ubW2mdvuj0cbpyw9dokv9lae9Sm28P2UUEFoCtV9dMZuuT3hsh8TYbx44/ZZLvYX1XdKcOVE/4wQ+/Dh2ao+J/MOJwK5iWgAtCbk0m+L8MY5n9J8ldJPre19oKNtoqzOZNh+M//zjDedW+i59dMXksX5qGLHwCArtzi8EUAAGB9BFQAALoioAIA0JWdmSQ1Xmj8gzP1rR0AAHTlZJK3tAMmQu1MQM0QTmf9PmMAADbnLhm+LW9fuxRQTyfJi1/x+px38uSm2wIAwJTrT5/OfS7+8OSQHu9dCqhJkvNOnszJ88/fdDMAAFiQSVIAAHRFQAUAoCsCKgAAXRFQAQDoioAKAEBXBFQAALoioAIA0BUBFQCArgioAAB0RUAFAKArAioAAF0RUAEA6IqACgBAVwRUAAC6IqACANAVARUAgK4IqAAAdEVABQCgKwIqAABdEVABAOiKgAoAQFcEVAAAuiKgAgDQFQEVAICuCKgAAHRFQAUAoCsCKgAAXRFQAQDoioAKAEBX5gqoVfXoqrqsqq4bby+uqgdMPH+nqnpmVV1VVe+sqr+qqoccss4nVlWbul216A4BALDdzplz+SuTPC7J68b7D0/y7Kq6Z2vtlUmemeSCJF+Q5OokX5LkWVX1ia21vz5gva9Mct+J+++ds10AAOyIuSqorbXntNae21p77Xh7QpLrk9x7XOQ+SX6ktfbS1trft9aelOSfkvzbQ1b9ntbaVRO3U3PvCQAAO2HhMahVdcuqeliS2yR58fjwnyZ5aFXdrqpuMT5/Ismlh6zuI6vqLVX1hqr65ar6sEXbBQDAdpu3iz9VdXGGQHpuhurpg1trrxqffmiSZyW5Jsl7krxrfP71B6zyz5N8eZLXJrljkm9N8qKq+tjW2jUHtONEhvC75+S8+wIAQH8WqaC+Jsk9MnTr/3iSZ1TVx4zPPSnJbTOMJ/3EJE9N8itjqN1Xa+15rbVfa629orX2giQPHJ96+CHteHySayduVy6wLwAAdKZaa0dbQdULkrw+yfdmmDz1ceOEqcnnX9da+5o51vn88TWPPmCZ/SqoV77iirfn5Pnnz7kXAACs2unrrsvFd7tDklzQWrvubMvN3cW/j8oQFG893n/f1PPvzRyV2jF4fnSSPzloudbamSRnJl436yYAAOjYvNdBfXJVfVpV3a2qLq6q70pySZJfSHJ5hgrq06rqk6vqw6vqvyW5X5LfnFjHC6vq6ybuf19VfUZV/euq+pQkv5rk/CTPOPLeAQCwdeatoN4xw7VO75xh3OdlSe7fWnt+klTV5yb57iTPSXJehsD68NbacyfW8eFJLpy4f5ckvzQ+dirJS5Lcu7X2D3PvDQAAW+/IY1B7UVXnJ7nWGFQAgD7NOgZ14eugAgDAKgioAAB0RUAFAKArAioAAF0RUAEA6IqACgBAVwRUAAC6IqACANAVARUAgK4IqAAAdEVABQCgKwIqAABdEVABAOiKgAoAQFcEVAAAuiKgAgDQFQEVAICuCKgAAHRFQAUAoCsCKgAAXRFQAQDoioAKAEBXBFQAALoioAIA0BUBFQCArgioAAB0RUAFAKArAioAAF0RUAEA6IqACgBAVwRUAAC6IqACANAVARUAgK4IqAAAdEVABQCgKwIqAABdEVABAOiKgAoAQFcEVAAAuiKgAgDQFQEVAICuCKgAAHRFQAUAoCsCKgAAXRFQAQDoioAKAEBXBFQAALoioAIA0BUBFQCArgioAAB0RUAFAKArAioAAF0RUAEA6IqACgBAVwRUAAC6IqACANAVARUAgK4IqAAAdEVABQCgKwIqAABdEVABAOiKgAoAQFcEVAAAuiKgAgDQFQEVAICuCKgAAHRFQAUAoCsCKgAAXRFQAQDoioAKAEBXBFQAALoioAIA0BUBFQCArgioAAB0RUAFAKArAioAAF0RUAEA6IqACgBAVwRUAAC6IqACANAVARUAgK4IqAAAdEVABQCgKwIqAABdEVABAOiKgAoAQFcEVAAAuiKgAgDQFQEVAICuCKgAAHRFQAUAoCsCKgAAXRFQAQDoioAKAEBXBFQAALoioAIA0BUBFQCArgioAAB0RUAFAKArAioAAF0RUAEA6IqACgBAVwRUAAC6IqACANAVARUAgK7MFVCr6tFVdVlVXTfeXlxVD5h4/k5V9cyquqqq3llVf1VVD5lhvf+lqt5QVTdU1V9W1actsjMAAGy/eSuoVyZ5XJJPHG9/kOTZVfWx4/PPTHL3JF+Q5OIkv57kWVV1z7OtsKoemuQHk3xXknsm+ZMkz6uqu87ZNgAAdsBcAbW19pzW2nNba68db09Icn2Se4+L3CfJj7TWXtpa+/vW2pOS/FOSf3vAav9rkp9urf2f1tqrW2vfmORNSR49/+4AALDtFh6DWlW3rKqHJblNkhePD/9pkodW1e2q6hbj8yeSXHqWdXxgknsl+f2pp34/yacesv0TVXX+3i3JyUX3BQCAfpwz7wuq6uIMgfTcDNXTB7fWXjU+/dAkz0pyTZL3JHnX+Pzrz7K6C5PcMsnbph5/W5I7HdKUxyf59nnbDwBA3xapoL4myT0ydOv/eJJnVNXHjM89Kcltk9w3wxjVpyb5lTHUHqRN3a99Hpv2lCQXTNzuMusOAADQr7krqK21dyd53Xj3ZVX1SUkeU1Xfm+Trknxca+2V4/N/M87I/9okX7PP6q5O8t7cvFp6h9y8qjrdjjNJzuzdr6p5dwUAgA4t4zqolWGc6a3H+++bev69Z9vOGHb/Msn9pp66X5IXLaFtAABsmbkqqFX15CTPyzDL/mSShyW5JMn9k1yeobL6tKr67xnGoT4oQ9j8vIl1vDDJb7TWfnR86KlJnllVL8swtvVRSe6a5CcW3isAALbWvF38d8xwrdM7J7k2yWVJ7t9ae36SVNXnJvnuJM9Jcl6GwPrw1tpzJ9bx4RkmRyVJWmvPqqrbJ/m2cb1/m+RzW2v/sNAeAQCw1aq1w+YibYfxUlPXvuKKt+fk+edvujkAAEw5fd11ufhud0iSC1pr151tuWWMQQUAgKURUAEA6IqACgBAVwRUAAC6IqACANAVARUAgK4IqAAAdEVABQCgKwIqAABdEVABAOiKgAoAQFcEVAAAuiKgAgDQFQEVAICuCKgAAHRFQAUAoCsCKgAAXRFQAQDoioAKAEBXBFQAALoioAIA0BUBFQCArgioAAB0RUAFAKArAioAAF0RUAEA6IqACgBAV87ZdAPYHadOn1nKei46eWIp6wEAtpOAytyWFUTnWb/QCgDHh4DKWa06iM7jbG0RXAFg9wiox1RP4fMojrofAi4A9EdAPQZ2JYyuwvSxEVgBYPME1B0llC5GYAWAzRNQd4hQunyTx1RYBYD1EFB3gGC6HsIqAKyHgLrFBNPN6TWsHnZO9NRWADgbAXULCaZ96WHc6qznxN5ygioAPRNQt4xw2r91BVbnAgC7SkDdIgLJdlpmYF3WOXDq9BlVVAC6JaBuCeF0d8wbWFf13gupAPRKQN0C2xBOT11/w1zLX3TeuStqyfbZhvcXANZJQO1cD+Fl3vC56DqF1vVTRQWgRwJqx9YVTlcRQBcx2Q5hFQCOLwG1U6sMp70E0oNMt1FgXR1VVAB6I6AeE9sQSg+iugoAx4eA2qFlVk+3PZjux/hVANhtAuqO2sVgepCD9ld4BYDtIqB2ZhnV0+MWTg8jvB7OOFQAeiKg7hjhdD5nO16CKwBsjoC6Q4TT5RFcAWBzBFSYg+AKAKsnoHbkKONPVU83y3VbAWB5BNQdsMxwes2Kv73q9sdkIo7rtgLA4gTULXfUcLrqQHrY9o5DYN2WsGomPwC9EFA7scqvNt3PuoPp2Uy2Q1gFAJLkFptuAItbtHraSzidds3pM922bRVOXX+DscMAsA8V1GNkW8LfXjuPQ0U1UVUFgGkqqB1YpHt/3srbtoTTScetopqoqgJAIqAeC9se8gRVADheBNQtNE9w2aVgJ6gCwPEgoG7YKmfv72qYE1QBYLeZJLVlNh1STl1/eDC86Lz1TG46bpeoSob3f5UTqVwLFYAeCKg76qgVxlmC6CKvXVV4PUpYXVY1dl0hee9Dihn/AOwqAXWD1n1x/lkcJZjOs/5VVlk31f2/7oruqqupALApAuoWmbV7f5GAtupgetD21jUkYJ3WdS1XIRWAXWSS1Ib0Uj09df2ZtYfTHtuwKts4oauXcxOA40tA3THzhKHeQqGguphNT5wDgGUTULfEskNIz0Fw14PqKgipAOwSAXUDVtWFOmv42Zbwty3tnNc2dPnr5gdgk0ySYiFXzxBgLlzCBKF1zPrfhGtOn1n6BCoTpgDYFQLqFlhm9+2iVclZAuksr1k0tJ66/oyQCgDHhC7+Ndtk9/4i4fTq02cWCqeHrW+Rde7i2NRld/cv9cOMbn4ANkQFlZtZZiCdZTvzVlV3rZqqkgoANyWgrtEiFallVcRmrTyuK5zut815guo6xqYedsx6DcnLHIt66vSZXCQ8A7BmAuoOWFY38SbC6fT2F6mmJssJi/MOH5he/ihtUEUFgBsJqMfALMHrqOH06qltXLhgWDtKt3+yWEhc1rjWXRt6AACbIqCuySa79w8zTzidDqLzLDdPaF2kmprMHlRXNdnqKCF1mVVU3fwAbDMBdccdFsRmDaezBtNZ1jFrUF00pCabvci/SioAHI3LTK3BKi/Xc5Txp+sMp9Prm7kSu+TLXK3LogG512+ZcskpANZJQO1UD9+tPk+QXPX6tzGkbloP5xAALEJAXbFNVp4OquIdFvhWGUz329Ys29u2kLprXyqgigrAuhiDusVW1R08bzg9W3CZd2LN1defOXR86lHGpQIA20FA7dCqu2YPqkTOEk5nraRNLzdLYBVSl2uZs/kTM/oBWA9d/CvUa/f+2RwWTk+dPnOkfZr19bvU3b9r3fwAsA4CamdmrZ4u2r1/tmA3SzhdllmC6i6F1F1jLCoAq7zKgk8AAB5lSURBVCagrsi2VU8PXN+K9mVZIVVQPZjZ/ABsG2NQO7KpsacHBcFVB+3DxjTOMiY1WfwrUs+2nrMx9nVgLCoAqySgbqF1Xcx91nB6toA76zdGLSukJotNoJrrq163dILWsidLAcAqCagr0GP3/rzV06V0v08sc1jAXHZITQ6udhoWAAD9ElA70dM4wYPC6aIX8N973UEhc5khNVldCFVFHdenmx+AFTFJaslWXT1dZvf+fmFzFeF0nnUso3K7DiqwALA6AmoHllU9nbd7fx7LDIbrvKQVN9VTpR4AzkZAXaJdrp4u21ECby9V1FW4/ZZ1mfswAcAqCKgbtg0VrVUFwqNc3mqXQ+qqbcM5B8DxJqBuicOqp/N0788T7uZa9vT8wUdIBQCmmcW/JIt0dfZUyTpKV+1kMJ38/4UnV3/dzXln9jNwXVQAeqaCugXWdWH+aYdVKK8+fcOBVdPDnp9lO7ME501VUpc9k3/bxp8CwKoIqEuw6erpUbv392v/LOF0VkcNqTNtQ3f/3JZ29QgTpQBYMgG1c5uqnh5kobGmC7xmz1G/cnWTLjL8AADmJqBuQE9jT+d1lKB52GuP2tV/2DqWbRu/TWraNp+LAOwuAfWIVtm9OUv1dBUX5++xEjmPbWy/8acAcCMBdc02WbHa9MX5k/V09TMfVVQAeiOgduoo1dNVOUq4nHkbS9qnq68/s5WVVABAQD2SXit6y7780bKts4q6DSFV9z4A3NRcAbWqHl1Vl1XVdePtxVX1gPG5u1VVO8vtiw9Y59P3Wf4lR92xHs3aldpj9XSdlh0qNxVSzeAHgMXM+01SVyZ5XJLXjfcfnuTZVXXPJJcnufPU8o9K8tgkzztkvb+b5Csm7r97znZxiG2oJM7q1OkzuUjVEQB21lwBtbX2nKmHnlBVj05y79baK5NcNflkVT04ybNaa9cfsuozrbWrDlnmWDhq9XSe7v1FLtC/rZb9lai7cIkpAOjVwmNQq+qWVfWwJLdJ8uJ9nr9Xknsk+ekZVndJVb29ql5bVT9VVXeYYfsnqur8vVuSk/Puw1HMOxbSTOmbWseEKwBgO80dUKvq4qq6PsmZJD+R5MGttVfts+gjk7y6tfaiQ1b5vCRfmuQzk/y3JJ+U5A+q6rAS1eOTXDtxu3L2vejTcR97OumwSu4iE9R2tToMALtmkQrqazJURu+d5MeTPKOqPmZygaq6VZIvyQzV09bas1prv9Na+9txCMEDknxUkgce8tKnJLlg4naXeXdk1/Q+e/84mXWClBn8AHBz806SSmvt3blxktTLquqTkjwmyVdPLPaQJLdO8nMLrP+tVfUPST7ykOXOZKjiJkmqat5NbZ3jUj3tnfGnALBay7gOaiWZ/ov9yCS/1Vo7NffKqm6f5EOSvHUJbdsas3TvL2qeru1lTiQCAFjEvNdBfXJVfdp4zdOLq+q7klyS5BcmlvmIJJ+e5P+cZR2Xj7P7U1XnVdX3VdV9xnVekuQ5Sa5O8hsL7VGHTJCiZxedd+6mmwAANzFvF/8dkzwzw/VOr01yWZL7t9aeP7HMVyZ5c5LfP8s67p5hzGiSvDfJxUm+PMkHZaia/mGSh7bWTs/ZtrXZxDdIHda9fxzHn27ieqi69wFg9ea9DuojZ1jmW5J8ywHP18T//znJ58zTBjbnwpPnrvXyUMu+dum6bNM3SC2jeupLEwBYtmWMQeWIVjn+lBttY9gFgONIQN0CZu/3Yde69409BaBXAuoxdrau2YMqjReeFGoAgNUSUHfAuidIHceQqnoKAOsjoLIv4zV31zLDqQlSAKyCgHrMLRowtq2KepTAPU/1tPcZ/CqnAGwDAfUYWDScHfa6o4TUbQu4AMD6CKgcya4HzV0ae7rs6qnufQBWRUDlwKAxS/V110PqLtC1D8A2EVAXoHJ0NOsOtAsPcVjD+7ytX9LgZwCAVRJQ1+Cw6tXtj/jHfpYgdVhIU0XdXaqnAGybczbdALbDheedyNWHfKPVZEi9+vQNhy7Ts10ae7psqqcArJoK6jFylCrq3Ns6ee7WhNFdpnoKwDZSQeUmLjp5IqfOMi5ylirqzV6z4ZC6yPjTRaunvV8DFQC2hQrqFlhm8DnqN0T5hqntsYrqqe59ANZBQF3QvH+oe5goNavD9m1dIXUTYdjY07MTTgFYFwH1GJol+AkjAMCmCKgsRFf/8eIDCwDrJKCu0VHGBM4yDnWe7ullVFF3LaTuUve+2fsAbDMBtSNHHYc6LyGVWaieArBuAuoR9PiHexNVQCEVAFgmAXXNVt3NP69eJ0wJvX3o8UMYALtPQD2iZf8BX3c3f6KrHwDoi4C6ZZY9WWqZjnNI9S1SALA8AuoG9DjDelld/Reed2Irg+ouzeBfFt37AGyKgLoEPXbzLxK4ljke9SghdZkB9+rrzyxtXQDAegioW2jT3cnrCKmzOnVaAAWAXSOgLsm8VdQeu/mT5YfKede3jcMDdpHufQA2SUDt1CZm889jngAjdAIA8xBQuZlVBMpZJk9tMshefYShApsecgEAu0ZAXaJ1dvP3cLmpRbqB94LqdGA9rlXW3ivlALAJAmrHtiG8HHWs4rZelgoAWB0BlX3tUmh0qSkA2C4C6pIdx9nPx3GfAYDVEVA3rNfLTTEbE6QAYPkE1B12lJnp89pkFdXF+gFgtwiondvkRKldGofao22YBAcAmyCgsjTGou4G7yMAmyagciyYyQ8A20NAZamOU/XNBCkAWA0BtXPXmAAEABwzAuqOWucM/mnHqYq6KBOkAODsBNQlc8kjAICjEVC31KnOJ/3sehW15/GnvvwBgG0noG7Yqetv2HQTzmpbZr7vehgGgONGQN1Bmxx/Oklw3J/xpwBwMAF1iZY9/tQM/j7p3geA1RJQWSlVVABgXgLqBi06/nQdE6SMP90+qqcA7AoBdUl6ubxUL+NPJ+1SiDxq977xpwBwOAG1U8afHm6Xgu9RqZ4CsEvO2XQDOB72wuQyKs2LBNMLD6l8XrjFYVc4BWDXqKBuyHEdf3qUqudFJ09stGqqex8A1kNAXQLjT+ezSNDUnb8/1VMAdpEu/g4dl/Gn+3X7C6KzE04B2FUCKhu36lB62PjTWfTWvS+cArDLdPFvwKLjTwEAjgMBdYusY4LUrpmlerrqGfyqpwAwHwEVtohwCsBxIKDuiGXO4F/GmM0eLGs/jjL+dJnVU+EUgONCQOVY25YL9AunABwnZvGzc3qpAC+rerrOcOoyXwD0QAWVffUS8ua17HYv2r3vW6MAYHEqqOyERYLpNnTv69oH4DhSQd0Rqwhb21BFvfC8E921cxu79gGgJyqoHOjC807k6o6uv7qsMDpLoD/qt0dtG+NPAeiFgErXequOHkb1FACOThf/Eux65WkTIXGVXferGnsqnALAcgioG7CNAWQdIXUvlK5yW7OGU937ALA5AuoWOSw0rXpW+iqC4zpC6fu3tcLjs83VU+EUgN4Yg8pcJoPkopOnNjJkYI4QtqnqqXAKAAMBdUkuOnkip073M9t9HWYJq5ue5LQN1zrdFOEUgF4JqB26/ckTuWbBsHvhyRO5egNBedNBdD+LhNNFqqfL6N7fxnHJALAqAuqGXHTeuTl1/Q0LvO5ETnV0XdJebHOlVNc+ANyUgLqDNlVFXadeAumyJketk3AKQO8E1CU6juNQ12FdYXQTk6PWVT0VSgHYJgJqp44yDjXZjSrqOqukmxp7ukpCKQDbSkDdIONQb24TXfe7dFkpoRSAXSCg7rBtqqJuakzpouH0qNXTZYdTwRSAXSKgLtkyx6Ee1M2/C1XUTU902oWvMxVMAdhFAuqGLdrNP6seq6jbHkx7qJ4KpgDsMgH1GOgppB6nMab7EU4B4HACaueW1c2/6ZC6ymC6zgC66Zn7wikAx4GA2oFVd/Nv0rKD6SaroT107QPAcSCgbrmeq6jLCKe9dM/3EE5VTwE4LgTULXDUi/ZPWkdI3aVg2gvhFIDj5BabbgCDo1TYeglzF548ceRwetF5J7rZnz2brp4KpwAcNwLqlljm5JxVTFjaxWCaCKcAsAkC6o6YN9wtM6QeZV09B1PhFAA2wxjUY2wvWC46JnUZVdMeLaNabcY+ACxOBbUjh4Waw4LTooFvkaC5S1XTvWrpMqqmiRn7AHBUKqg7Zp7LTk2adXb/rlRNN33B/YMIpwAcdwLqllnmJaem7dflv8yxqssOpz2GTF37AHB0AmpnlvGtUotWUfesYpb/ssJpj6F0j659AFgOAZWVO2o47TmUJsurmgqnADAwSWoLzRLYehnrKZzOuJ7O9xMA1kkFdclOrfG77nt3lHDaezBNhFMAWBUV1A7NEnx6r6IKpwDAolRQl6jH6ulRJ0wtus1FHMdgqnoKADengrokPYbTPeuqpB7lAvzCKQCwR0DdYvOEulWH1F3u0r/ovHOFUwBYIwF1CVZRPV3FGMdVhdRdDaerCKaJcAoAhxFQj2jTXfvzBrxlh9RdDKerCqaJcAoAszBJ6gg2HU4XtayJU7sSTtc1I184BYDZzFVBrapHV9VlVXXdeHtxVT1gfO5uVdXOcvviA9ZZVfXEqnpLVf1zVV1aVR971B3bBbMGp0XC3lHC5VEmQyWbD6d7FdJVVkpvtk3hFABmNm8F9cokj0vyuvH+w5M8u6rumeTyJHeeWv5RSR6b5HkHrPOxSf5rkkckeW2Sb03y/Kq6e2vt9JztW5ttrZ5OmgyZh1VUlzU0YBPhdNPXLBVOAWA+cwXU1tpzph56QlU9Osm9W2uvTHLV5JNV9eAkz2qtXb/f+qqqknxjku9qrf36+NjDk7wtyZckedo87VuXHsPp7U+eyDVHaNd+YXXZ41XXHU43HUwT4RQAFrHwJKmqumVVPSzJbZK8eJ/n75XkHkl++oDV/Oskd0ry+3sPtNbOJPmjJJ96yPZPVNX5e7ckJ+ffi/7NE7KWFQCP2oW/n3WG03V23Z+1DSdPCKcAsKC5A2pVXVxV1yc5k+Qnkjy4tfaqfRZ9ZJJXt9ZedMDq7jT++7apx9828dzZPD7JtRO3Kw9rO5ux7nC6aYIpABzNIhXU12SojN47yY8neUZVfczkAlV1qwxd9AdVTye1qfu1z2PTnpLkgonbXWbc1pH02L0/adMTkKYJpwDAvOa+zFRr7d25cZLUy6rqk5I8JslXTyz2kCS3TvJzh6xub8zqnZK8deLxO+TmVdXpdpzJUMVNkgzDWXfTReedm1PX37DpZsxNOAUAFrGMC/VXkum/zI9M8luttVOHvPYNGULq/d6/sqoPTPIZSQ4aGsABeqiiHqdwarwpACzXXBXUqnpyhktGvSnDpKSHJbkkyf0nlvmIJJ+e5HPPso7Lkzy+tfYbrbVWVT+Y5Fuq6u+S/F2Sb0nyriS/OPfe0IXjFk4BgOWat4v/jkmemeF6p9cmuSzJ/Vtrz59Y5iuTvDkTM/On3D3DmNE935vkVkn+d5LbJvnzJJ/d4zVQNzn+dN5u/qNedmoRPVRu10UwBYDVqdYOm4u0HcZLTV37iivenpPnn7+SbWx6gtQi41DXFVKP0wX4hVMAWMzp667LxXe7Q5Jc0Fq77mzLzT1Jiu2yjkrqcamcCqYAsB7LmCTFmixaMVxVgLz9yRPCKQCwdCqox8SyK6mbDqbr6t4XTAFg/QTUY2QvVC4aVDcdStdNOAWAzdDFv2WWUTmcN2j21pW/juqpcAoAm6OCekwdFDivOX2mq0C6bsIpAGyWCio3I5wCAJskoG6hTX970iatct+FUwDog4AKEU4BoCcC6pY6jlXUVe2zcAoAfRFQ5yDIAACsnoC6xY5TFVX1FACODwGV7gmnAHC8CKhbbterqMIpABw/Aird2vXwDQDsT0CdU4+Vt10Kchedd+77byvbRofvIQBwIwF1R2x7SF11KAUAtsc5m24Ay3PReefm1PU3bLoZM9tEIFU9BYD+qaAuoOeQ03sVch1d+ADAdhNQd1CP4a+HUNrzBwsA4EYC6o7adBjc00MwBQC2i4C6oG2oxm06GG56+5O24f0CAAYC6o7byESkzqqmwikAbBcB9RhYZ1jsKZgCANtJQD2CbarMraOq2WM43ab3CAAYCKjHzMq+2144BQCWREA9hpYdJnsMpwDA9hJQj2hbq3TLCpW9htNtfV8AAAH1WDtquBROAYBVEFCXYJsD0aIhs9dwCgBsPwGVucNmz+F0mz8sAAADAXVJtj0YzRI6e7sA/7Rtfw8AgME5m24A/bjovHNz6vobbvYYAMA6qaAu0S5U8PYCae/V0mm7cOwBgIGAumS7EJS2KZgmu3HMAYAbCagrIDCtj2MNALtHQGVrCacAsJsE1BURnlbL8QWA3SWgrpAQtRqOKwDsNgF1xYSp5XI8AWD3CagAAHRFQF0DVb/lcBwB4HgQUNdEuDoaxw8Ajg8BdY2ErPlddPKE4wYAx4yAumbC1uwcKwA4ngTUDRC8DucYAcDxJaBuiAC2P136AICAukGC2E05HgBAIqBunFA2cBwAgD3nbLoBHG+CKQAwTQW1A8c1pB3X/QYADiagduI4hTUToQCAgwioHTkOoe047CMAcDTGoLIWgikAMCsV1M7sYpDbxX0CAFZHQO3QrgQ6Y00BgEUIqKyEYAoALEpA7dS2BjxVUwDgqATUjm1b0Nu29gIAfTKLnyMTTAGAZVJB7VzP4U93PgCwCiqozE0oBQBWSUDdAhedPJFTp89svA0AAOsgoG6JvYC4zqAqlAIAmyCgbpllB1UhFADojYC6pWYJqsInALCNBNQtJ4QCALvGZaYAAOiKgAoAQFcEVAAAuiKgAgDQFQEVAICuCKgAAHRFQAUAoCsCKgAAXRFQAQDoioAKAEBXBFQAALoioAIA0BUBFQCArgioAAB0RUAFAKArAioAAF0RUAEA6IqACgBAVwRUAAC6IqACANAVARUAgK4IqAAAdEVABQCgKwIqAABdEVABAOiKgAoAQFcEVAAAuiKgAgDQFQEVAICuCKgAAHRFQAUAoCsCKgAAXRFQAQDoioAKAEBXBFQAALoioAIA0BUBFQCArswVUKvq0VV1WVVdN95eXFUPmFrmPlX1B1X1zqr6p6q6tKpudcA6n1hVbep21aI7BADAdjtnzuWvTPK4JK8b7z88ybOr6p6ttVdW1X2S/G6SpyT5+iTvTvIJSd53yHpfmeS+E/ffO2e7AADYEXMF1Nbac6YeekJVPTrJvTOEzB9I8sOtte+eWObvZlj1e1prqqYAACw+BrWqbllVD0tymyQvrqo7JPmUJG+vqhdV1duq6o+q6t/NsLqPrKq3VNUbquqXq+rDFm0XAADbbe6AWlUXV9X1Sc4k+YkkD26tvSrJXqh8YpKfSnL/JH+V5IVV9ZEHrPLPk3x5ks9J8lVJ7pTkRVV1+0PacaKqzt+7JTk5774AANCfRSqor0lyjwzd+j+e5BlV9TET63paa+1nW2t/3Vr7pnH5rzzbylprz2ut/Vpr7RWttRckeeD41MMPacfjk1w7cbtygX0BAKAzcwfU1tq7W2uva629rLX2+CR/k+QxSd46LvKqqZe8Osld51j/O5O8IslBVddkmIh1wcTtLrNuAwCAfi3jOqiV5ESSK5K8Jcndp57/qCT/MPPKqk4k+ejcGHj31Vo701q7bu+W5PQ8jQYAoE9zzeKvqicneV6SN2UY8/mwJJckuX9rrVXV/0ryHVX1N0lenqGb/t8kecjEOl6Y5Ddaaz863v++JM9J8sYkd0jyrUnOT/KMI+0ZAABbad7roN4xyTOT3DnDuM/LMoTT5ydJa+0Hq+rcDJebul2G7v/7tdZeP7GOD09y4cT9uyT5pfGxU0lekuTerbWZq64AAOyOaq1tug1LMc7kv/YVV7w9J88/f9PNAQBgyunrrsvFd7tDklwwDtHc1zLGoAIAwNIIqAAAdEVABQCgKwIqAABdEVABAOiKgAoAQFcEVAAAuiKgAgDQFQEVAICuCKgAAHRFQAUAoCsCKgAAXRFQAQDoioAKAEBXBFQAALoioAIA0BUBFQCArgioAAB0RUAFAKArAioAAF0RUAEA6IqACgBAVwRUAAC6IqACANAVARUAgK4IqAAAdEVABQCgKwIqAABdEVABAOiKgAoAQFcEVAAAuiKgAgDQFQEVAICuCKgAAHRFQAUAoCsCKgAAXRFQAQDoioAKAEBXBFQAALoioAIA0BUBFQCArgioAAB0RUAFAKArAioAAF0RUAEA6IqACgBAVwRUAAC6IqACANAVARUAgK4IqAAAdEVABQCgKwIqAABdEVABAOiKgAoAQFcEVAAAuiKgAgDQFQEVAICuCKgAAHRFQAUAoCsCKgAAXRFQAQDoioAKAEBXBFQAALoioAIA0BUBFQCArgioAAB0RUAFAKArAioAAF0RUAEA6IqACgBAVwRUAAC6IqACANAVARUAgK4IqAAAdEVABQCgKwIqAABdEVABAOiKgAoAQFcEVAAAuiKgAgDQFQEVAICuCKgAAHRFQAUAoCsCKgAAXRFQAQDoioAKAEBXBFQAALoioAIA0BUBFQCArgioAAB0RUAFAKArAioAAF0RUAEA6IqACgBAVwRUAAC6IqACANAVARUAgK4IqAAAdEVABQCgK+dsugHLdv3p05tuAgAA+5g1p1VrbcVNWY+q+ldJrtx0OwAAONRdWmtvPtuTuxRQK8kHJznuJdSTGYL6XeJYrItjvl6O93o53uvleK+X470ZJ5O8pR0QQnemi3/cybMm8eNiyOlJktOttes22ZbjwjFfL8d7vRzv9XK818vx3phDj7VJUgAAdEVABQCgKwLq7jmT5DvGf1kPx3y9HO/1crzXy/FeL8e7UzszSQoAgN2gggoAQFcEVAAAuiKgAgDQFQEVAICuCKhbpKoeX1V/UVWnq+rtVfWbVXX3GV73RVX1qqo6M/774HW0dxcscsyr6hFV1fa5nbuudm+rqnp0VV1WVdeNtxdX1QMOeY3ze0HzHm/n9nKNv19aVf3gIcs5x5dgluPtHO+HgLpdPiPJjyW5d5L7ZfgmsN+vqtuc7QVVdZ8kz0ryzCSfMP77f6vqU1bf3J0w9zEfXZfkzpO31toNq2zojrgyyeOSfOJ4+4Mkz66qj91vYef3kc11vEfO7SWoqk9K8qgklx2ynHN8CWY93iPneAdcZmqLVdVFSd6e5DNaa398lmWeleT81toDJh773STvaK39p/W0dHfMeMwfkeQHW2sftM627aqq+sck39xa++l9nnN+L9khx/sRcW4fWVWdl+SvkvyXJN+a5OWttW88y7LO8SOa83g/Is7xLqigbrcLxn//8YBl7pPk96ce+70kn7qSFu2+WY55kpxXVf9QVVdW1W9X1T1X3bBdU1W3rKqHJblNkhefZTHn95LMeLwT5/Yy/FiS32mtvWCGZZ3jRzfP8U6c4104Z9MNYDFVVUmemuRPW2t/e8Cid0rytqnH3jY+zhzmOOaXJ3lEklckOT/JY5L8WVV9Qmvt71be0C1XVRdnCEjnJrk+yYNba686y+LO7yOa83g7t49o/BBwrwxDKmbhHD+CBY63c7wTAur2+tEkH5/k382w7PQ4jtrnMQ430zFvrb0kyUv27lfVn2XoXvr6JN+wygbuiNckuUeSD0ryRUmeUVWfcUBocn4fzczH27l9NFX1IUl+KMlnzzmm0Tm+gEWOt3O8HwLqFqqqH0nyBUk+vbV25SGLX5Wbf9K+Q27+iZwDzHnMb6K19r6q+oskH7mSxu2Y1tq7k7xuvPuycXLDY5J89T6LO7+PaM7jPf1a5/Z87pXh/PzLoUMmSXLLJJ9eVV+X5ERr7b1Tr3GOL26R430TzvHNMQZ1i9TgR5P8hySf2Vp7wwwve3GG2eeTPjvJi5bdvl204DG/2ToyVKjeuuz2HROV5MRZnnN+L99Bx/umCzq35/XCJBdnOGZ7t5cl+YUk9zhLWHKOL26R430TzvHNUUHdLj+W5EuSfGGS01W196n62tbaPydJVf1ckje31h4/PvdDSf64qv5HkmePr71vZhsawALHvKq+PUMX0d9lGMP0DRl+wX3tmtu+darqyUmel+RNSU4meViSS5Lcf3ze+b1E8x5v5/bRtNZOJ7nJ+PWqemeSa/bGtTvHl2eR4+0c74eAul0ePf576dTjX5Hk6eP/75rkfXtPtNZeNA4Sf1KS70zy+iQPba39+UpbujvmPuYZxvL9ZIZuuWuT/HWGoQEvXVkrd8cdM1zn8c4Zjt1lSe7fWnv++Lzze7nmOt5xbq+Dc3y9nOOdch1UAAC6YgwqAABdEVABAOiKgAoAQFcEVAAAuiKgAgDQFQEVAICuCKgAAHRFQAUAoCsCKgAAXRFQAQDoioAKAEBXBFQAALry/wPRaVSsqkudAwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 800x800 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "static_mean = np.mean(static_mean_list)\n",
    "static_std = np.mean(static_std_list)\n",
    "static_mean_str = \"{:.2f}\".format(static_mean)\n",
    "static_std_str = \"{:.2f}\".format(static_std)\n",
    "#print(static_std_list)\n",
    "bins=np.arange(np.min(static_std_list),np.max(static_std_list),0.1)\n",
    "plt.figure(figsize=(8, 8), dpi=100)\n",
    "ax = plt.subplot()\n",
    "ax.set_xlim(np.min(static_std_list), np.max(static_std_list))\n",
    "sns.kdeplot(static_std_list,static_mean_list,shade=True)\n",
    "plt.title(\"Sensor Base: mean=\"+static_mean_str+\"mg std=\"+static_std_str+\"mg\")\n",
    "plt.savefig(dataset_name+\"_static.png\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 6. 矫正加速度列表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "acc_list = acc_list - static_mean # 将加速度列表矫正到0\n",
    "acc_avg = acc_avg - static_mean"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 7. 以秒为单位计算std和avg，找出最大的以判断时域波形刻度范围"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 225/225 [00:00<00:00, 22480.19it/s]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "13.564525155684148 [ 12.52746633 -12.23253367   4.91746633  23.51746633  -3.20253367\n",
      "   7.78746633  26.43746633  -5.92253367 -17.59253367 -36.85253367\n",
      " 376.13746633 -57.00253367 116.64746633 -98.64253367 162.69746633\n",
      " -74.00253367  71.94746633 -42.29253367  38.88746633 -39.27253367\n",
      "  31.02746633 -31.75253367  13.08746633 -19.63253367  29.14746633\n",
      " -15.98253367  15.80746633  -1.93253367  12.18746633  -8.99253367\n",
      "  -1.15253367  -8.27253367   0.49746633  -7.33253367]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 800x800 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "SECOND_WINDOW = 32# sample rate 32\n",
    "second_mean_list = []\n",
    "second_std_list  = []\n",
    "acc_mean_max = float(0)\n",
    "acc_std_max = float(0)\n",
    "#遍历加速度，寻找传感器安静的时间段，记录它的avg和std\n",
    "for k in tqdm(range(SECOND_WINDOW,acc_list.size,SECOND_WINDOW)):\n",
    "    acc_list_slice = acc_list[k-SECOND_WINDOW:k]\n",
    "    acc_mean_max = acc_mean_max if(acc_mean_max>np.mean(acc_list_slice)) else np.mean(acc_list_slice)\n",
    "    if acc_mean_max>10000:\n",
    "        print(acc_mean_max,k)\n",
    "    acc_std_max  = acc_std_max if(acc_std_max>np.std(acc_list_slice)) else np.std(acc_list_slice)\n",
    "    second_mean_list.append(np.mean(acc_list_slice))\n",
    "    second_std_list.append(np.std(acc_list_slice))\n",
    "print(np.mean(acc_list[5342:5376]),acc_list[5342:5376])\n",
    "acc_mean_str = \"{:.2f}\".format(acc_mean_max)\n",
    "acc_std_str = \"{:.2f}\".format(acc_std_max)\n",
    "# print(static_std_list)\n",
    "bins=np.arange(np.min(second_std_list),np.max(second_std_list),0.1)\n",
    "plt.figure(figsize=(8, 8), dpi=100)\n",
    "ax = plt.subplot()\n",
    "ax.set_xlim(np.min(second_std_list), np.max(second_std_list))\n",
    "sns.kdeplot(second_std_list,second_mean_list,shade=True)\n",
    "plt.title(\"max_mean=\"+acc_mean_str+\"mg max_std=\"+acc_std_str+\"mg\")\n",
    "plt.savefig(dataset_name+\"_dist_std_and_mean.png\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 8. 以1024个点为单位遍历一次，找FFT的直流分量大小"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6045913514913049"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "FFT = list()\n",
    "for i in range(0,len(acc_list)):\n",
    "#     if FFT_0<np.mean(acc_list[i:i+32]):\n",
    "    FFT.append(np.mean(acc_list[i:i+1024]))\n",
    "#     print(np.mean(acc_list[i:i+32]),i)\n",
    "np.mean(FFT)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 9. 开始画图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "fig= Figure(figsize=[25.6,14.4],dpi=100,facecolor=\"black\",edgecolor=\"#BEBEBE\")\n",
    "canvas = FigureCanvas(fig)\n",
    "ax_chart_32s = fig.add_axes([100/2560,1100/1440,1278/2560,300/1440])\n",
    "ax_chart_1s = fig.add_axes([1518/2560,1100/1440,372/2560,300/1440])\n",
    "\n",
    "ax_violin = fig.add_axes([1518/2560,750/1440,372/2560,300/1440])\n",
    "ax_violins = fig.add_axes([100/2560,750/1440,1378/2560,300/1440])\n",
    "\n",
    "ax_spectrogram_32s = fig.add_axes([100/2560,50/1440,1378/2560,300/1440])\n",
    "ax_spectrogram_4s = fig.add_axes([1518/2560,50/1440,372/2560,300/1440])\n",
    "\n",
    "ax_FFT_32s = fig.add_axes([100/2560,400/1440,1378/2560,300/1440])\n",
    "ax_FFT_4s = fig.add_axes([1518/2560,400/1440,372/2560,300/1440])\n",
    "\n",
    "ax_kde_1 = fig.add_axes([1940/2560,50/1440,560/2560,300/1440])\n",
    "# ax_kde_2 = fig.add_axes([2196/2560,50/1440,314/2560,314/1440])\n",
    "\n",
    "ax_video = fig.add_axes([1940/2560,400/1440,560/2560,994/1440])#[x,y,width,height] y in range of 456 and 496\n",
    "canvas.print_figure(\"123.png\")\n",
    "fig.savefig(\"sample.png\",facecolor=fig.get_facecolor(),edgecolor=fig.get_edgecolor())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "512.0"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "CONST_ACC_MAX = math.pow(2, int(math.log(acc_mean_max + 4 * acc_std_max, 2)) + 1)\n",
    "CONST_ACC_MAX"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 使用seaborn画violin"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "def whiten(ax, title):\n",
    "    spine = ['bottom', 'top', 'right', 'left']\n",
    "    for tickline in ax.xaxis.get_ticklines():\n",
    "        tickline.set_color('white')\n",
    "    for ticklabel in ax.xaxis.get_ticklabels():\n",
    "        ticklabel.set_color('white')\n",
    "    for tickline in ax.yaxis.get_ticklines():\n",
    "        tickline.set_color('white')\n",
    "    for ticklabel in ax.yaxis.get_ticklabels():\n",
    "        ticklabel.set_color('white')\n",
    "    for orien in spine:\n",
    "        ax.spines[orien].set_color('black')\n",
    "    ax.set_facecolor(\"black\")  # grey\n",
    "    title.set_color(\"white\")\n",
    "    title.set_fontsize('large')\n",
    "\n",
    "\n",
    "def whiten_violin(result):\n",
    "    for key in result:\n",
    "        if key is not 'bodies':\n",
    "            result[key].set_color('')\n",
    "            \n",
    "def violins_color_decide(color_relative):\n",
    "    if color_relative<2:\n",
    "        return [1,0,0]#red\n",
    "    elif color_relative<4:\n",
    "        return [255/255,128/255,0/255]#orange\n",
    "    elif color_relative<8:\n",
    "        return [255/255,255/255,0/255]#yellow\n",
    "    elif color_relative<16:\n",
    "        return [255/255,255/255,128/255]#light yellow\n",
    "    elif color_relative<32:\n",
    "        return [1,1,1]#WHITE\n",
    "    elif color_relative<64:\n",
    "        return [128/255,255/255,255/255]#light blue\n",
    "    else:\n",
    "        return [0,255/255,255/255]#plain blue"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 128/128 [04:41<00:00,  2.20s/it]\n"
     ]
    }
   ],
   "source": [
    "#plt.savefig(\"sample.png\")\n",
    "CONST_ACC_MAX = 128\n",
    "# define the limits automatically\n",
    "#设置时域图和violin的y坐标的上下限\n",
    "CONST_ACC_MIN = -CONST_ACC_MAX\n",
    "CONST_CHART_WINDOW = 1024\n",
    "CONST_FFT_WINDOW = 1024\n",
    "CONST_VIOLIN_WINDOW = 32\n",
    "CONST_VIOLINS_WINDOW = 1024\n",
    "CONST_VIOLINS_DIV = 32\n",
    "CONST_SAMP_RATE = 32  # 采样率\n",
    "CONST_COLOR_STD_LMT = 128\n",
    "CONST_BLUE_RGB = [0, 0, 255]\n",
    "CONST_WHITE_RGB = [255, 255, 255]\n",
    "CONST_FFT_MIN = 0\n",
    "CONST_FFT_MAX = 1\n",
    "#可以从第几个帧开始绘制\n",
    "CONST_MIN_K = 7100\n",
    "CONST_MAX_K = 5000\n",
    "#帧图片文件夹\n",
    "CONST_FRAMES_DIR = \"dir_frames_toilet\"\n",
    "\n",
    "            \n",
    "for k in tqdm(range(CONST_MIN_K, acc_list.size)):  # start form 1024, shift 8 every time\n",
    "#     if k==CONST_MAX_K:\n",
    "#         break\n",
    "    ax_violin.set_ylim(CONST_ACC_MIN, CONST_ACC_MAX)\n",
    "    ax_violins.set_ylim(CONST_ACC_MIN, CONST_ACC_MAX)\n",
    "\n",
    "    # 绘制时域32s图\n",
    "    slice_start = k - CONST_FFT_WINDOW\n",
    "    slice_end = k\n",
    "    if slice_start < 0:\n",
    "        slice_start = 0\n",
    "    acc_slice = acc_list[slice_start:slice_end]\n",
    "    avg_slice = acc_avg[slice_start:slice_end]\n",
    "    std_slice = acc_std_list[slice_start:slice_end]\n",
    "    \n",
    "    if acc_slice.size<CONST_CHART_WINDOW:\n",
    "        acc_slice = np.lib.pad(acc_slice, (CONST_CHART_WINDOW - acc_slice.size, 0), 'constant', constant_values=(0, 0))\n",
    "        avg_slice = np.lib.pad(avg_slice, (CONST_CHART_WINDOW - avg_slice.size, 0), 'constant', constant_values=(0, 0))\n",
    "        std_slice = np.lib.pad(std_slice, (CONST_CHART_WINDOW - std_slice.size, 0), 'constant', constant_values=(0, 0))\n",
    "    \n",
    "    ax_chart_32s.plot(acc_slice, 'w',avg_slice,\"y\")  # '--w'\n",
    "    ax_chart_32s.set_ylabel(\"avg and realtime\",color = \"w\")\n",
    "    ax_chart_32s.set_ylim(CONST_ACC_MIN, CONST_ACC_MAX)\n",
    "    title = ax_chart_32s.set_title(\"Realtime chart,Time: \" + str(acc_time[k]) + \"  Reading: \" + \"{:.2f}\".format(acc_list[k]) + \"mg\")\n",
    "    whiten(ax_chart_32s, title)\n",
    "    \n",
    "    #32s时域图上加std，双坐标系\n",
    "    ax_chart_32s_std = ax_chart_32s.twinx()\n",
    "    ax_chart_32s_std.plot(std_slice,\"g\")\n",
    "    ax_chart_32s_std.set_ylabel(\"std\",color = \"w\")\n",
    "    ax_chart_32s_std.set_ylim(-acc_std_max,acc_std_max)\n",
    "    whiten(ax_chart_32s_std, title)\n",
    "\n",
    "    #绘制时域1s\n",
    "    acc_slice_1s = acc_slice[-32:]\n",
    "    ax_chart_1s.plot(acc_slice_1s,'w')\n",
    "    ax_chart_1s.set_ylim(CONST_ACC_MIN, CONST_ACC_MAX)\n",
    "    title = ax_chart_1s.set_title(\"Last second\")\n",
    "    whiten(ax_chart_1s, title)\n",
    "    \n",
    "    # 绘制FFT图\n",
    "    #########################################\n",
    "    fft_abs = abs(fft(acc_slice))\n",
    "    fft_norm = fft_abs / int(CONST_FFT_WINDOW)\n",
    "    fft_half = fft_norm[:int(CONST_FFT_WINDOW / 2)]\n",
    "    fft_DC_32s = fft_half[0]\n",
    "    fft_half[0]=0\n",
    "\n",
    "    ax_FFT_32s.bar(x=np.linspace(0, CONST_SAMP_RATE / 2, 513)[:-1],\n",
    "                   height=fft_half,width=0.032,bottom=0,align=\"center\",color=\"white\")\n",
    "\n",
    "    ax_FFT_32s.xaxis.set_major_locator(MaxNLocator(nbins=20, prune='lower'))\n",
    "    title = ax_FFT_32s.set_title(\"FFT chart:0 - 16Hz, DC:\"+\"{:.2f}\".format(fft_DC_32s)+\"AC max:\"+\"{:.2f}\".format(np.max(fft_half)))\n",
    "    title = ax_FFT_32s.set_title(\"FFT chart:0 - 16Hz\")\n",
    "    whiten(ax_FFT_32s, title)\n",
    "    ax_FFT_32s.set_ylim(CONST_FFT_MIN, CONST_FFT_MAX)\n",
    "    ax_FFT_32s.set_xlim(0, 16)  # 0-4hz\n",
    "    \n",
    "    #4s fft\n",
    "    fft_abs = abs(fft(acc_slice[-128:]))\n",
    "    fft_norm = fft_abs / int(128)\n",
    "    fft_half = fft_norm[:64]\n",
    "    fft_DC_4s = fft_half[0]\n",
    "    fft_half[0]=0\n",
    "    \n",
    "    ax_FFT_4s.bar(x=np.linspace(0, CONST_SAMP_RATE / 2, 65)[:-1], \n",
    "                   height=fft_half,width=0.15,bottom=0,align=\"center\",color=\"white\")\n",
    "    ax_FFT_4s.xaxis.set_major_locator(MaxNLocator(nbins=4, prune='lower'))\n",
    "    title = ax_FFT_4s.set_title(\"FFT chart:0 - 16Hz, DC:\"+\"{:.2f}\".format(fft_DC_4s)+\"AC max:\"+\"{:.2f}\".format(np.max(fft_half)))\n",
    "    whiten(ax_FFT_4s, title)\n",
    "    ax_FFT_4s.set_ylim(CONST_FFT_MIN, CONST_FFT_MAX)\n",
    "    ax_FFT_4s.set_xlim(0, 16)  # 0-16hz\n",
    "\n",
    "    # 绘制violin图\n",
    "    ##########################################\n",
    "    slice_start = k - CONST_VIOLIN_WINDOW\n",
    "    slice_end = k\n",
    "    if slice_start < 0:\n",
    "        slice_start = 0\n",
    "    acc_slice = acc_list[slice_start:slice_end]\n",
    "    if acc_slice.size<CONST_CHART_WINDOW:\n",
    "        acc_slice = np.lib.pad(acc_slice, (CONST_VIOLIN_WINDOW - acc_slice.size, 0), 'constant', constant_values=(0, 0))\n",
    "    \n",
    "    acc_slice_dataset = pd.DataFrame(acc_slice)\n",
    "    violin_mean = acc_slice_dataset[0].mean()\n",
    "    violin_std = acc_slice_dataset[0].std()\n",
    "    violin_mean_str = \"{:.5f}\".format(violin_mean)\n",
    "    violin_std_str = \"{:.5f}\".format(violin_std)\n",
    "\n",
    "    face_color = [(CONST_WHITE_RGB[i] - (CONST_WHITE_RGB[i] - CONST_BLUE_RGB[i]) * abs(violin_std / CONST_COLOR_STD_LMT)) / 255 for i in range(3)]\n",
    "    for color in face_color:\n",
    "        if color<0:\n",
    "            color=0\n",
    "\n",
    "    ###########seaborn violin#############\n",
    "    violinplot_ax = sns.violinplot(x=acc_slice, color=face_color, ax=ax_violin, linewidth=0,orient=\"v\")\n",
    "    ax.grid(False)\n",
    "    \n",
    "    title = ax_violin.set_title(\"Realtime violin. Mean: \" + violin_mean_str + \"  Std: \" + violin_std_str)\n",
    "    ax_violin.yaxis.set_major_locator(MaxNLocator(nbins=16, prune='lower'))\n",
    "    whiten(ax_violin, title)\n",
    "\n",
    "    # 绘制violins图\n",
    "    ################################\n",
    "    slice_start = k - CONST_VIOLINS_WINDOW\n",
    "    slice_end = k\n",
    "    if slice_start < 0:\n",
    "        slice_start = 0\n",
    "    acc_slice = acc_list[slice_start:slice_end]\n",
    "    if acc_slice.size<CONST_CHART_WINDOW:\n",
    "        acc_slice = np.lib.pad(acc_slice, (CONST_VIOLINS_WINDOW - acc_slice.size, 0), 'constant', constant_values=(0, 0))\n",
    "\n",
    "    violins_dataset = pd.DataFrame([acc_slice[int(t - CONST_VIOLINS_DIV):int(t)] for t in list(np.linspace(0, 1024, CONST_VIOLINS_DIV + 1)[1:])])\n",
    "    \n",
    "    color_list = []\n",
    "    for row in range(CONST_VIOLINS_DIV):\n",
    "        violins_color = abs(violins_dataset.loc[row, :].std())\n",
    "        violins_color_relative = violins_color / CONST_COLOR_STD_LMT\n",
    "        if violins_color_relative>1:\n",
    "            violins_color_relative=1\n",
    "        color_list.append(violins_color_decide(violins_color_relative*128))\n",
    "        # rgba in float 0-1 form\n",
    "        \n",
    "    violins_result = ax_violins.violinplot(dataset=violins_dataset)\n",
    "    ax_violins.yaxis.set_major_locator(MaxNLocator(nbins=(CONST_ACC_MAX / 4) + 1, prune='lower'))\n",
    "    \n",
    "    for pc in range(len(violins_result['bodies'])):\n",
    "        violins_result['bodies'][pc].set_facecolor(color_list[pc])\n",
    "        violins_result['bodies'][pc].set_edgecolor(color_list[pc])\n",
    "        violins_result['bodies'][pc].set_alpha(1.0)\n",
    "    \n",
    "    title = ax_violins.set_title(\"History violins\")\n",
    "    ax_violins.yaxis.set_major_locator(MaxNLocator(nbins=16, prune='lower'))\n",
    "    whiten(ax_violins, title)\n",
    "    whiten_violin(violins_result)\n",
    "    \n",
    "    #draw specgram\n",
    "    ####################################\n",
    "    #32s\n",
    "    slice_start = k - CONST_FFT_WINDOW -128\n",
    "    slice_end = k\n",
    "    if slice_start < 0:\n",
    "        slice_start = 0\n",
    "    acc_slice = acc_list[slice_start:slice_end]\n",
    "    if acc_slice.size<CONST_CHART_WINDOW:\n",
    "        acc_slice = np.lib.pad(acc_slice, (CONST_FFT_WINDOW - acc_slice.size, 0), 'constant', constant_values=(0, 0))\n",
    "\n",
    "    spectrum_32s,freqs_32s,ts_32s,fi_32s=ax_spectrogram_32s.specgram(x = acc_slice,\n",
    "                mode='magnitude',\n",
    "                scale = \"linear\",\n",
    "                NFFT=128,\n",
    "                Fs=32, Fc=None,\n",
    "                window=np.hanning(M = 128), \n",
    "                noverlap=127,\n",
    "                sides=\"onesided\",\n",
    "                xextent=[0,32],\n",
    "                vmax=CONST_FFT_MAX,\n",
    "                vmin=0,\n",
    "                cmap=plt.cm.gray\n",
    "                )\n",
    "    \n",
    "    title = ax_spectrogram_32s.set_title(\"32s spectrogram\")\n",
    "    whiten(ax_spectrogram_32s,title)\n",
    "    #4s\n",
    "    spectrum_4s,freqs_4s,ts_4s,fi_4s=ax_spectrogram_4s.specgram(x = acc_slice[-256:],\n",
    "            mode='magnitude',\n",
    "            scale = \"linear\",#do not use db, or the graph would have a bunch of drak part                             \n",
    "            NFFT=128,\n",
    "            Fs=32, Fc=None,\n",
    "            window=np.hanning(M = 128), \n",
    "            noverlap=127,\n",
    "            sides=\"onesided\",\n",
    "            xextent=[0,4],\n",
    "            vmax=CONST_FFT_MAX,\n",
    "            vmin=0,\n",
    "            cmap=plt.cm.gray\n",
    "            )\n",
    "#     mode : {'default', 'psd', 'magnitude', 'angle', 'phase'}\n",
    "#     What sort of spectrum to use. Default is 'psd', which takes the power spectral density. PSD is the square of magnitude\n",
    "#     'magnitude' returns the magnitude spectrum. 'angle' returns the phase spectrum without unwrapping. \n",
    "#     'phase' returns the phase spectrum with unwrapping.\n",
    "\n",
    "#     scale : {'default', 'linear', 'dB'}\n",
    "#     The scaling of the values in the spec. 'linear' is no scaling. \n",
    "#     'dB' returns the values in dB scale. When mode is 'psd', this is dB power (10 * log10).\n",
    "#     Otherwise this is dB amplitude (20 * log10).\n",
    "#     'default' is 'dB' if mode is 'psd' or 'magnitude' and 'linear' otherwise. This must be 'linear' if mode is 'angle' or 'phase'.\n",
    "\n",
    "\n",
    "    title = ax_spectrogram_4s.set_title(\"4s spectrogram\")\n",
    "    whiten(ax_spectrogram_4s,title)\n",
    "    \n",
    "    #draw pca result\n",
    "    ##################################################\n",
    "    ax_kde_1.set_xlim(np.min(acc_pca0_list),np.max(acc_pca0_list))\n",
    "    ax_kde_1.set_ylim(np.min(acc_pca1_list),np.max(acc_pca1_list))\n",
    "    sns.kdeplot(acc_pca0_list[k-128:k],acc_pca1_list[k-128:k],shade=False,ax = ax_kde_1,cmap=plt.cm.gray)\n",
    "    \n",
    "    title = ax_kde_1.set_title(\"PCA KDE\")\n",
    "    whiten(ax_kde_1,title)\n",
    "    \n",
    "    # 调整 video框\n",
    "    ax_video.set_facecolor(\"black\")\n",
    "    spine = ['bottom', 'top', 'right', 'left']\n",
    "    for orien in spine:\n",
    "        ax_video.spines[orien].set_color('white')\n",
    "    ax_video.axis(option=False)\n",
    "\n",
    "    # save figs\n",
    "    fig.savefig(\"dir_frames_printer/\" + str(10000000000 + acc_ms[k]) + '.png', facecolor=fig.get_facecolor(), edgecolor='none')\n",
    "    ax_chart_32s.cla()\n",
    "    ax_chart_32s_std.cla()\n",
    "    ax_chart_1s.cla()\n",
    "    ax_FFT_32s.cla()\n",
    "    ax_FFT_4s.cla()\n",
    "    ax_violin.cla()\n",
    "    ax_violins.cla()\n",
    "    ax_spectrogram_32s.cla()\n",
    "    ax_spectrogram_4s.cla()\n",
    "    del fi_32s #delete the fig instance, otherwise would slow down the process due to memory depletion\n",
    "    gc.collect()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    " "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x16007f5f248>]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(np.arange(2000, 2010), range(10))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
